"""author: wenyao
   data: 2021/11/12
   project: cjh
"""
#匿名函数
#不需要创建函数名
#只能有一个表达式， 不用写return， 该表达式的结果就是返回值

# def add(a, b):
#     return a+b
# print(add(1,3))
#
# add2 = lambda x,y: x+y
# print(add2(1,3))
#
# #使用匿名函数来返回两个数之间的最大值
# comp = lambda x, y: x if x>y else y
# comp = lambda x, y: max(x, y)
# comp = lambda x, y: x > y and x or y

#使用匿名函数，将传入浮点数保留两位小数
# f = lambda x:float('%.2f'%x)
# f = lambda x:round(x,2)
# print(f(3.456546))

#递归函数
#自己调用自己，形成循环
#定义出口条件， 什么时候结束递归
#通常是把一个大问题通过寻找规律可以缩小规模的时候使用的

#求取n的阶乘
#n!=1*2*3...*n
#f(n) = n* f(n-1)

#有最大递归深度 996
# def func01(n):
#     if n ==1 :
#         return 1
#     return n * func01(n-1)
# func01(1000)

#尽量避免使用递归， 除非没有更好的算法，或者是某种特定的情况下使用递归
#每次递归都会保存结果在内存中，非常占用内存，效率低下

#使用递归实现斐波拉契数列
#1,1,2,3,5,8,13
#第一第二位都是1， 后面的数都是前两个数的和
#f(n) = f(n-1)+f(n-2)

def fblq(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fblq(n - 1) + fblq(n - 2)

a = int(input("请输入数列项数："))
str1 = ''
for i in range(a):
    str1 += str(fblq(i + 1)) + ','
print(str1)

#有一对雌雄兔，每两个月就繁殖雌雄兔一对，问n个月之后有多少对兔子？
#第一、二个月 ：1对
#第三、四个月： 2对
#第五、六个月：4对
#第七、八个月：8对
#f(n) = f(n-2)*2
# 兔子繁殖
def rabbit(n):
    if n == 1 or n == 2:
        return 1
    return rabbit(n - 2) * 2
print(rabbit(8))
